#ifndef __MY_CONFIG__
#define __MY_CONFIG__
// 防止头文件重复包含的宏定义

#include "util.hpp" // 包含自定义工具库
#include <mutex>    // 标准库互斥量头文件（用于线程同步）
#include <iostream> // 标准输入输出流
#include <string>   // 字符串类

namespace cloud // 定义cloud命名空间
{
#define CONFIG_FIlE "./cloud.conf" // 配置文件的默认路径宏定义

    // 配置类（单例模式）
    class Config
    {
    private:
        Config()
        {
            ReadConfigFile();
        } // 私有构造函数（禁止外部实例化）

        static Config *_instance; // 静态单例实例指针
        static std::mutex _mutex; // 静态互斥锁（用于线程安全）

    private:
        // 配置项成员变量
        int _hot_time;                // 热点时间阈值（单位：秒）
        int _server_port;             // 服务器监听端口号
        std::string _server_ip;       // 服务器IP地址
        std::string _download_prefix; // 文件下载URL前缀
        std::string _packfile_suffix; // 打包文件后缀名（如.zip）
        std::string _pack_dir;        // 打包文件存储目录路径
        std::string _back_dir;        // 备份文件存储目录路径
        std::string _backup_file;     // 备份元数据文件路径

        // 读取配置文件内容
        bool ReadConfigFile()
        {
            FileUtil fu(CONFIG_FIlE); // 创建文件工具对象
            std::string body;         // 存储文件内容

            // 读取文件内容到body
            if (fu.GetContent(&body) == false)
            {
                std::cout << "load config file failed!\n"; // 文件读取失败提示
                return false;
            }

            Json::Value root; // JSON解析根节点
            // 反序列化JSON内容
            if (JsonUtil::UnSerialize(body, &root) == false)
            {
                std::cout << "parse config file failed!\n"; // JSON解析失败提示
                return false;
            }

            // 从JSON对象中提取各配置项
            _hot_time = root["hot_time"].asInt();                  // 获取热点时间
            _server_port = root["server_port"].asInt();            // 获取服务器端口
            _server_ip = root["server_ip"].asString();             // 获取服务器IP
            _download_prefix = root["download_prefix"].asString(); // 下载前缀
            _packfile_suffix = root["packfile_suffix"].asString(); // 打包后缀
            _pack_dir = root["pack_dir"].asString();               // 打包目录
            _back_dir = root["back_dir"].asString();               // 备份目录
            _backup_file = root["backup_file"].asString();         // 备份文件
        }

    public:
        // 获取单例实例（线程安全双检锁模式）
        static Config *GetInstance()
        {
            if (_instance == nullptr) // 第一次检查（提高性能）
            {
                _mutex.lock();            // 加锁
                if (_instance == nullptr) // 第二次检查（确保线程安全）
                {
                    _instance = new Config(); // 创建单例实例
                }
                _mutex.unlock(); // 解锁
            }
            return _instance; // 返回单例指针
        }

        // 以下为各配置项的获取方法（访问器）
        int GetHotTime() { return _hot_time; }                       // 获取热点时间
        int GetServerPort() { return _server_port; }                 // 获取服务器端口
        std::string GetServerIp() { return _server_ip; }             // 获取服务器IP
        std::string GetDownloadPrefix() { return _download_prefix; } // 获取下载前缀
        std::string GetPackFileSuffix() { return _packfile_suffix; } // 获取打包后缀
        std::string GetPackDir() { return _pack_dir; }               // 获取打包目录
        std::string GetBackDir() { return _back_dir; }               // 获取备份目录
        std::string GetBackupFile() { return _backup_file; }         // 获取备份文件
    };

    // 静态成员初始化
    Config *Config::_instance = nullptr; // 初始化单例指针
    std::mutex Config::_mutex;           // 初始化互斥锁
}

#endif // 结束头文件保护